package com.huangkailong.sqlprinter.agent.mysql.driver;

import javassist.CtClass;

/**
 * @author huangkailong
 * @since 1.0.0
 */
public abstract class DriverAgent {
    public DriverAgent() {
    }

    /**
     * 生成 Log 打印代码。
     *
     * @param varName 待打印的变量名
     * @return java 语句
     */
    protected String generateSqlPrintSrc(String varName){
        return String.format("System.out.println(\"SqlPrinterAgent\"+\"|\"+Thread.currentThread().getName()+\"|\"+\"SqlLog|\"+%s);", varName);
    }

    /**
     * 生成格式化 SQL 代码
     *
     * @param varName 保存 SQL 的变量名，且类型必须是 {@link String} 类型.
     * @return 格式化后的 SQL 语句
     */
    protected String generateSqlFormatSrc(String varName){
        return String.format("%s = %s.replaceAll(\"\\r\\n|\\r|\\n\", \" \");%s = %s.replaceAll(\"\\\\s{2,}\", \" \");",
                varName, varName, varName, varName);
    }

    /**
     * 判断类是否支持。
     *
     * @param className 类的全类名
     * @return true 表示支持
     */
    public boolean isSupport(String className){
        if(className == null || className.length() <= 0){
            return false;
        }

        return doIsSupport(className);
    }

    /**
     * 获取 SQL 代码
     * @param varName 待打印的变量名
     * @return SQL 代码
     */
    protected String getSqlSrc(String varName){
        return generateSqlGetSrc() +
                generateSqlFormatSrc(varName) +
                generateSqlPrintSrc(varName);
    }

    /**
     * 判断类是否支持。
     *
     * @param className 类的全类名
     * @return true 表示支持
     */
    public abstract boolean doIsSupport(String className);

    /**
     * 增强类。
     *
     * @return 增加类的二进制
     * @throws Exception 增强时抛出的异常
     */
    public abstract CtClass enhanceClass() throws Exception;

    /**
     * 生成 SQL 获取代码。
     *
     * @return SQL 获取代码
     */
    protected abstract String generateSqlGetSrc();
}
